<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/%E8%BF%AA.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/%E8%BF%AA.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
  <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"zhengyidi.github.io","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":"flat","style":null},"back2top":{"enable":true,"sidebar":true,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="设计模式 - 结构型 - 代理模式">
<meta property="og:type" content="article">
<meta property="og:title" content="12.代理模式">
<meta property="og:url" content="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/12.%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="Zhengyidi&#96;s 学习记录">
<meta property="og:description" content="设计模式 - 结构型 - 代理模式">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-07-11T00:00:00.000Z">
<meta property="article:modified_time" content="2021-11-13T14:58:22.506Z">
<meta property="article:author" content="zhengyidi">
<meta property="article:tag" content="设计模式">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/12.%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>12.代理模式 | Zhengyidi`s 学习记录</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="Zhengyidi`s 学习记录" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Zhengyidi`s 学习记录</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">休对故人思故国，且将新火试新茶。诗酒趁年华。</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-fw fa-th"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/12.%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="zhengyidi">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Zhengyidi`s 学习记录">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          12.代理模式
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-07-11 00:00:00" itemprop="dateCreated datePublished" datetime="2021-07-11T00:00:00+00:00">2021-07-11</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-11-13 14:58:22" itemprop="dateModified" datetime="2021-11-13T14:58:22+00:00">2021-11-13</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" itemprop="url" rel="index"><span itemprop="name">设计模式</span></a>
                </span>
            </span>

          
            <div class="post-description">设计模式 - 结构型 - 代理模式</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
  <script id="hbeData" type="hbeData" data-hmacdigest="6c985d00d7016538460b8cba0fb45df58a8a12232ff81a4dd2d18dcc0760561f">22064b17c03cb0c0e58c99349b6889d0b31470871e725085fde7c8feed9af7ef8f42e30b10099c5515af9f144a94bf112636886d3df09fd18d48b399baff0a40622d14ebf5826603eb124264c74267bea87252949c9ee98bce9e09d0ffca52e88d97f1c4fb8e74ee1be52cf4185117a9264b0ef1c6fc706608b2797f4cac5f53f4be72454fd382206bfe14c425821a835dd4bc6c5ad4796cc12efb3b7d664360564fcaa62a3e602279c78f80026d111d3de4051bfe7ba0a77a0c828aa26774f2a65c7e38dbd920bbfe34ba426528bd643b35bcca69b4808047e6c7f55a99308573079555a5513546e67e6ae7e152a7f7e7fb6839566ea5fb1582167142a16302f8ac9b3670559257e8365724bb1f2ad9df265433fa7befe77fce84c743595103f67ca39acf7bb05ff709de0e77f12be4bb270e17ec8d88af220c66dda61a1a328e543a206d193f94b0c957faa71b028bfd8cb8402e16771b708b42572ec197c7dc7a4ff22ce587b9e80315fe3eed6f646b5b7a4f01d9890b5f9f131deb163bcc88a9cbb6d2888e1377dff272d6be8e51ca325d9ca8afc4668f308a3f1aca4abf8786ffd995c171e8dc11f61a52060004cc9d8a1e7daa370efdf8dc6c3cf007fb402e860134602a02c5afd488c3c85199a5ddbfef24e26faaf9bbb515bc1ae05c84047636b0066897e5537a9dc671c4d8aa09c2ae7b5afc8a52b27c144c65636523ec46e61588aef6e83425940b5d5504a4eabbed3460e6dda009e279401aa06647345768e74c75fc171373fb788c2c354a9fd0b7b959914a78ecfea303ff0b6e83e6893d8c8d083f32c939dd535e426662f740db5a7db7b48b3092eb38c54fa554a7674d818654ce14ca764310e55001efd33aa2d64b57d52df17fd852ea588a9e0312892929245f423e43d37c63f106f1ac118d8916eda7fe1565aba1e19603a829688c6e8ed8a01c10d22de1bf8375ceb0c1f878a19225210c7e297c17391fe2b20662f207ef53b9cab9e1e7ba445237675b9707097baa5156bf81614dce1a61b5a479948f4c5902b6134a4b54554e5d01a9c92276b702126c68eb22575576a1350eb4ff95219243731d3af4a0afd55bab7dfe537d2bc9982739121485462dab40357ea9c94c46a2fc79450b2b163eab2e49349dcec140094dd416c4d6e70c47102e4264d32adffd6563a473bec81ee078114c0dee80a11fa44de45efe82ec9c41287b79c7596e36c420c8f5ac917a3f3211694bee510c5dc6c8ee618b3d00d51a210ea102ce60947d2f9facaf3dbf3523c3cbcadc7cf237f53b9e0f1e4fc90d553cf5b086028ef49057367ee3d5e3eab1f03ad181a64917dc86b54945a99dd70e732b6bbc984430ade740352f94a2f43c7f5454f85618c0cdb72b1cbaf973ea7f9f4b2630fb46af4e7a83dcb468e096215eb23a763470cdbb931d6d3125afe330790f6332361c89bfb02a15eef573cc11ba6cf809f22c74ce94e87e635902691521ae3147600c030f0d14a0b0d0c9df4f39b7dba080f7410abf2cb4aa6bdb83bee85b035c47982f925507b3d19b75ba3a4b2af83c476beb0f5454eeaffabf558b465e710b18eae7bfb57e126655fda3454d39a40a56900eb254d4fd41b6f5658911ff46762af90cd6b2f92eaf783d8442dcb0645d7f4aa6e5a4b449d27b4f987291908fe827e80f11905332afc296501833a15997e468ef2932a8aefe7844874c56471b1e653ddcf70215ced5b89848e9322345606016407346811cfe58477ed30d0633781b0830f4ff99dcff64096c1536e72245f5516c529c70cff88c0becbfdfb876d88f3092d425b6a16bb8d53f091bbc6e653c624b17ab3db101f2bc14d7c3df038210fb35ff6e192256742811e8a85e6ddd074692acda2c0e74f78545690f05570a2367d1d06a8959f21cb7545deb05ee0d31a0f09ddbb532c2d336a51767fa268fbedac141b024702f3b9a50e6eb060efdeca8f41d914f35eb166867f116e0f256001f5f2d5a70503e2cd70bbe151c9e65a832123cbacc06cdaf662f61d4a01cf3b4371cb970f2d16cb2cd48b465bae504ab00f91e2dea8cae99f929903876bedb70b69ac390a81f9c9cd2a7dce9b46539dcff539ce1871cfefcdd6e2597ca1b8437f2ec324f47ad1269e9e28b71268e727909d21d0c1a218e2249277dedc497524c2e56a4cd71c04ea5e287dd59a57322d807599f20ad38d2fd3142ce1be31bf931bf685d970200c9f4dad9763ae231035fbbb5d08c6315d78a0eb33655e56dd24a52815432e57b43ac89b2ced93442ca7d8c6dc59be956ac95b3bf3c104ed577711e382501d5cc7961bd1817d62866c17228ca8397e79d62303bcce4a9e63310362fcede5cf7b36b20086fd21fa830e48e73e513d527eeeeda941fe092a6c2c8b7afec3d31285d7a999740a8128779cd015979557c67f941faba53cf0d10f892aa0e391820e5f0145944bfda041c3b53da357a263b3d2d1e0aec583a29e7de24f413299a34accd655ab5ebe95e3dbfffa74ffe4a9112b379b8f23df5d9b101e61ba064c8c297485e11f4bf534fbdc814eeafd38be4ec0b59c0dcde006604b99a0517ff319ddeea68ac759a6c67da97d2116ebf4b1f155586ee3fe0306b453e06e9f67913e31471b22b7b5af39df66b257046aa3911e5ff442b49ff3004fa3890f5f727962ded236bb5e944213785fd25e75b52bda6251fa4f93d8ecb7470633cf45817f3c5133e3b135773db0a206f1dbc04291d0cffeb49c74ff4d1bcaa13d5cc6defdccc126bbd35c127e1d63d80bd2bb4c8b4d1a8f8e6d443f244cc496b83c814767a5ab3eb68779e5e538f1b74d17455b8cc24a5194b20529dc54cd38d049f9d9fc7b4797bead8b844efbf7a55075e521c11abea182ff77115fcd2d12d6f32585e43f255854fe7eaba416cf8d823648e468405cbdbd49f5878543e35bcbf3b415ea1cbbce6894e10d9d0dfba371a32531550de722e6e7dd1ac3d13e2c0ef2014f82199242d24d531b85e6669c50e940ee985589f7eea505255782f2d7f3f4f1714a440b7917d4b866584dddbd0e3c21a94d764fb0637126367f3902a4a5b14418eebed79337d5dad70b4baefab4fc5e17be39567b0c6313baf4239fe516e1973d700475f736e124697f6ed5e94e97e51968f4d0d6f0d7bbb674941c30d5fc2ca9756b328b76a9fac35878658b5cca1360e70ca5a94de180779b254026d01acb12fab02d01d797b259cbedb56d1b526ce95ebf05f854870d60958b29adcf275387d81f82613ef2077b3b3b0550281dd870f28b185be66c73d22cd3cd0fd39470c8f447ee29d0d01e2b5ea6fbc7fb8ef05288d7a879b96fd298df6b80f9aa7ba5b8c35039a945956d70afc0ea653422d6ed43cd2db010e650875ce5f86b7e434fa9e966a10f77e92b588ad9bd87ab6601e62fa01f2b96088c3eaf50029ec5eef5124b51d5a91d0e12d0a0a7e186b5729eeb466eda8ac9ff62baa7bba3394e25c1a41f9201ea0bf265791b7c26ae19ba56766fe20d6b3188026e653a6dace7e4c222901c3db4283e83a1727ff967a3156875212a24238f3dbf0b74494d8545482ee7b6992570e83cee521dcf56dbea6c0bbe6a3adc40f54968ebfc685168b735f7865fb4047cfecd4b73e2dcdd092014b0a947536a0f13a9dd057c09417fadd40743dc76fb6323eb95350b9af86be8c6330c8ca93760fcf593589f25c238da6bcc3cdb16ce9a3738fe7c0f33e1eff742bcfaa1be644e92cfc1cf59aaf9acd0cbde5ec2e643d31e5f94440c9e87f962f48227847ca7380990c130152c768ba792e03d063a953b896bf4f117f24b31e7508f27238b9b4f53f70d089d26102731169e6255ab7713fdd6a5ad11390383aeb1269eb05da07d7085cf764eabe28dc27aaad364745061f3aa8e29ee1d991823d5cdd466b97b38bebed9c94a7214e31cca93d7e10f94243bf7ffc9995a152953b88605def2e49a55eaebd13d2bcb4dcabcec17b10d86cbc2616712ec62f531b34e591385e2e3013917974f7997a70ad9af4ff3f913979d84b677012a9da8cda394786d0d169f5a2e69d0464097f647c2598aa7ec7964b8216e6aeaf1864c706b6c3ef310b1406e9ecaa3e810fb543d4cb23a10faafd74e03a1ca62ff4e6a6d0813bbe947d1ae9189fbae33afda2733e3a197440752bbcfacf2d976799969457796b4ed2ad5255500f54782db10d221c8e6590a9d7da5b5f85e7308ed9d2084945949aaed34c80fc68f8f6d5600b6809594fc6b30dd51cea4cef8824bf6cf15ca28e839cec19bbfa675cff5923d49a9ef2420fba2e055ddfeb613b874038380de73a2c594705216b1422382809ae7c3088476808fc1535fb87660bb385bc9623776e633acfa671afcb334339893a47f0299746b0ea5a041334332c388f7645de7a770176b76aa4405c6a57445857e3c4c1098707538fcb0c7489d1f8bb047306a1aa218c5847e6af9043b722d6e61fe6f7b3894f8b41de1300d4dd98c2ece64be4b0aa6d271757c4df5cb4e82b32f44906b3c135cecdd0450cc4ccb92682cac2615d706281badb5a368e57e47abc7427b0f6d621d9a745a519185a423a1726122b539ab108b53de5ccd46229e05b84482889d79246e0ccdc566546ba47af4e6e2ef81f007806f600719e3df668407423bc0f113ee35947e4ab0dfca7d9e91bc106cbba55c24cfa86f67bbefa5030d0cf085c66bcb4dd1e46009c8cc2b77c15ac48de2002eadc62c9f97ddd89ea9a3efcf4182d9141fe0a22e8c89918ed9c7e96d3ffabbc02fd79ef6833e5efd1b34f7b09c99a948560b0f7519797cf8aea32e533a4699e4a7df5d872a2458ab81589796d71cdc338040ef22acea3ee4855cba7fca2722609cf9facf6ea1c3a3f4dadce8275a8e0816ddfc1e952b2dfe0a3c7a10497d0ba75aade518c04bc2d260a3dcb826e72e85d50eb169d3745cbd56cab30b45edee51375d303323bfef4de4a03c3da05beae4f11fc7a3e9508b076ee408e94ce2fd27d7fd01c48d9fcef7f173f9c1e40a9bdc8cd8fd83b0e323d8a913fcbd8af9ed3a96a30c8e0108ec0e5bc1c2af8deb42e86f66fd45e5787a9b22890bb55cbebe9d5f196ba2ffe71576641d9290d4931e7c8582c8d290e14a79e60db55de0745e2f7df3286ca1bf604b795181423742d58b3b54d1e5c427c26ffa3fc7036c460af6c77f752508dfdcc0c8db2085d753df53502aae4462a03e09e272e3362b9f9e99f5cf780b37b66ba9ac03cc411836510b72bef44b14cca2122c78110f8858725d014e4c8072b66735c3764da8cea48c680491ab1d052964c676092edc4fb4b45e8ec369a675a1f4299f163d9163709af1769c8cacd24be72f1467e5eb5052ac1e58ff89bb81037d9fc8e5466f93b69b6028942a5f5ff727a8f62d9b9e3bae531e4da18122da5483f216d81ce7e52a3d5efbdeb9229e911609108b289b6c9071204399409d045559e209c9310ae9f557fb12e747f02bd8d9aefadc8d534284523a36e4f1a9967b2b436ef8e0947bc5760ceffbe8cd39374112f7bd4d3b1cb4ef953b89cd50fc2e1b7c08830fbac1e0f9ea6e022bd4ab6310480cfbb2cc9b7dba99862565deae3347d1c67c4cbb1370224007e4356ff6a32cc95b01e6d0d89aabb733a01e31107dc259027301caff67c47b63eb860d547c448b2da25cb0ddc641634440ea6ec66ced325f9e47e144a630d676d1b3e6acd6828ae7565635c065acdd95ed4f560a1b6d77f21ce6cfa23557c899574eed67b15075ff73b4b16b2dcb4b16f8848f95a3a2e30a199c870e360fcabc14524d7fdced1a0930312b12a1eecd644b5c3f98a9427f792615b7ea6c447fc1fe2aaa022dc8ec6e04a4c226d36c0c9083089e27174158f20b271637ba7581bcbb4cdce8fdc006e70e210a346f842f11dcd82035adc27d3fdf54dedebdecf5173cffff6237a7145f128d66d738f6466062dcfee0a93b7b1db1b1c868ea76310ddeb328bea3ccf8a09d58b4a247e551e5383d5ce93a8d420c4e40ced13e74c951c4d5e2a9afc0470aefbb7d314e738b79f8508cd2a3a2bbbde2e2bd2a0553ce80d3fda6b05abf3fcd1ae13a078b7b4d24e5463165966d11988057d39a8f01ba0d37e5e113935e1b6ca6e115fc7186c52bf6b1e3002c9d65ea0c54be22290f5e23783c53c0f16a54a05a1209dfa2307be63a9ef3affb7fe143fda1fb809eb34a1db9d82ac2d8160ee9a17bb3c088258ff24ca04612ace4ba6522fbb2340a32627e528f5669b87dc521c154555bcb31f6d2577bb53854160da283be983a9a88c44885dc6c8d3fcf5a3b9d58f9d29b52e6c31d7924f49f1dadb99c3a83890c85de2e17362ddc23f5d53f2c022b770633fa4f545709e8b0fd2c6ba2a24bb6435490f3bde601a9d0cfb9d7faa20257899c595ed0bb0938440adb5d9b241df165dfe2e0c5208ffa4fbd2ee7942d91eaae7a598a9c7f1fe06bfec0a3644d5c9975f12e9ca2e71024eca98ed0d1aa3aa52ca3d6412605675ad19bec50c61dce215a24d19327e1674c3c1321aabf5016741f25a9114da169bc7b2d342ac05e9fc33da15e038eb01012903eef9901c262725f39a376d2a3167da475d9b6b2f076816cdcf2514bbeae418f849c852185d23b3ae9bbf6661a846c955d9b0c473d69b45213508119e893b18cada6a6d1be2348c07afd361b3bd40c64dc5673cbc0ba8b7ec0790a484071748df41777243aab3bccac19036589724e96ebfe2162dadb3f1817e0f6598441d65b3c831a8a889719e65f02ad70b0fcadedc6f1dea29eaa1b4e485c3e9a1e1f7791e01b23cab96fddfcbb22daa8f8649fdf4b8cdef6c5142ad96b92a1c014fc8f13582774fb728e7ea6ed1c74b428c030e5303f3210877d487a81d746413fe6754517715deee5dc979ebf1c5673e0fb68570fe2ab661fe67bd261b904ef08898995a34965c2064af17f7655eb42b810224869e818e5d43466736099d7c8d32311e46848abd7a15ea76cdf6e08b769b4f8b2e4a3aa12e0888d8434735353b056a365cfbb5d00c95dd47dd9bff7f1b4680f5f34cfa0de8962447de1f8cc9f784d0359d8e6fc41675371de3d7e1d690133825d1e678864ad71b7b7fb3c7dcb7e522d3476ff0c171deeac4c0c991bb5cbb38ed2365c377ba53a73e084cfe44d85dfff45798686f8455c60ce8119e38c745d1d2d7b2861c62e237b5e891e5d151815368cfdee628b29a5db4d4420555830f16e1424224569b33849be37d8d8817ce6ff4aa34209f378316aff320d47839c3df88d490cab4f621c310ba7d19d0e53e849beed67ca18f949a1f26c460542ae07b3e4808171eae315634a3397dfc510fadfd8ef3f5987a1b5c0d9a5bfff9fe7434b8cd5b3a7b6db0c8d4c495365caedb97135c03ea9c1f11cf6f0d1fe09927b954c58a16566733e70cc8cfa45b3108fa78668ccb4ecfb05344881f4be93cf50bf3c95cac82d46f2099598a8990ab8b831552e6808f131d3aeb228e268ff72cf47cae9085bb3d092dfaa14a71d3d6dfc88fd8000e98dd87f4b9840c68f9a14ada46d9c8f4c664d0e21f9f50178044d78f1bbf59edc358cc412c5bfe940fb764c9ba66ff2eaf8aaa9d68fe65f1f911ea144c1ea0268c9888d53c490d83f6213fc8338867d1e28dd2d2c46cb0e4e584b3dede82ffb07f7935e114e59be7a46c07daad9db51d186cac6cbe1c472e5c247bcce8bb66f12460852b8ce488b31d6fd89d4afe44fef5e2678d7c226c037456f019ae23e92746f35b17b222ef7db9471357b0880a36d3a516153c83c43b80b63f502b6d6cfece9bace3cb8f815440efc7a3e022eedad9e7b30861a32b6f19fad310d8a19c78edd86e62565fd80daf967bb1f2eeafc2d947b6966550f31d17e3eb27ca78da37e2defc3ea2313e646d5acfcfb3af7c2091c2a7ed19881dc6d74dcdaef07ad64b6c529dd5b68a25e320ae0ed65ca0b8bc0c806dcb9a25a70d552606d43e9e07567e1c0e64900d0e799c0c8d46f05a5fbb642d40f9540d306c6d5b9f00a4afa52c47eeadc6157d5d0ab9132254e8262afbb2ae0b851c096ce68dd7d972681a76c581e9b159b16b8c465cc60c1b5d175b14b7d4d2107e226fc0ad787d774045ab616a2ff919126ab5beef23931c3e969667c254bd5d27c9089fc238a757c3191e219c64d84bdc45984ee544c0690ca39b0d924744bd3e511a44a8ed53132af115ffbe3b4fbe0158b7795bc9bfffb2b19e01457c210311b75fdca4d7ec2e9274279706a45ca15d89f0eb64232156035349dc0304eaa955636dd82db5c7cda5a4190215c466821afa3d9182535e8a7e17fcc4782bd52dab902e88dc62e3bad43342cd58f5436ecbadd5c5c94b4856be2127cd855b490c31e92868646e94f3e122309643653a7cab9241a3e75ba1153fbb25f9e083eff8c0cf68366601a6a01e43f13817195aa1758e6d47368616c88c177b9fa1eb5c2b8808b87471e5e07dade7ff87aca9df4c83ceaee43c1a317e29e0af90f6c002a75a7042be9e5386733def7d70e5b4372d4394758197d213a477e05b880f63968708101114a882c0472e17a9df789a917fc812fbc012da37a8e8f27365223bcf3e04cbe4abb9ea8600e4d77620f77d898d49f0581d4b2fbf4f9673275ac7f86d152d04830d0ea6679182b6d5667650dd5bb241b93a1be23f148886b875b361c3a2c70969a7b9c705d9c776a06069be5bc2f4d5a5e8d0387010eaf80c8594173ff90d7fa9a13b3464e4a9dabca4c9e0a6b7e4643654df422d8c613f2b2535350453d7f8e7cd4c3548a29b1354fc26aa74e821dcdc66c12ca615ff71e6db439b92d714c61314d523318a2f25029aa5636bce56a76a37ecf346fda9de3ddfc0f609f74be6c8300d2432b2397f551f819504a23e3138355ea1fe8eee47fa337fb1ed75f990f5b410681f4ad9582f8cc08ad7d522a825fd28d9fa15e6181bafad24449efcdc15586ad6468df9ca7785248d0c0d6d5a42896f002ad889de5dd03fd32ef6837a023e7b346520ba3b508cbcb652ec994569061aa491d761eee7bfa4507c808f68e4d00805bcdd7beaded8d2c5851fe62d4a8e473abf2492fc8d5466a7f2bdab1eac1ad0decb063dede7bfc68685a921edf3e8024a858e9e074e45719a42163a68f1eb83206f62b91b229adc2605978f66aa0e569f113da38964803be5e6dc94bc322775f6de4a83c5a81ab89196bbbc222e54af72eaf8226be0888178cdcd1218a5e3e49dda5e2ca80c6ed3538fedf2b728c7a685fb7eb00051a8af7fe53158cde12cc399b3d5559dc8c31504a51a21a3bbc102c898b7c9f740e07cb228b53b0d1e650037ab9083ee49cea8834e5ccede07488958206913db35e9b56d64414cc8c9b1ebedf8896529d5e68f7381d7b95b3098cf1bc8417c2294a819449c7b3449a9b49e65843abbb7e2391f9896bcfe918c1a74e2d622ec75c05e42f0f1991df191b4814d32cea5e08902ef8d9012e9cc7bda81546f41972cd752593058529273d9f906a5074ad195bb26c638a15d7e2229a116ea2c298714ea3fb915e56928b803216f4c213564905b0d86de4cb2da56675cd9c0912a401c4c1c706073ca011e4ce9de15ae31138682906f78fc1d157ef0da587f27e016a6c892f8817fdca1c246156fbe382a3e5cf77da6a809f18775d5da26fb6659c5d587c586546dc451eed7362c167fadde849b7a7d11c1ea170c7f20792401e5b99bcc3fb5d8c3b5dabb4b59adb8958b1e153e38a9b52bb608a896072957bdc1d3e436b580365d19b65fd56730cb6dbe522d6fd55d05bd5f74028e092a4cbcc116fc00e234bc19b7ccc3664134fe669f357925431e63dbe189eafe2dca01a143ed8d7b8b94a7def9ee591062d2ca174c5dc496c7d0afad3169778b28fe16c4a49452c91ee953debbc76d679fe5f15c3a5ccf774ca6aa9b926c942a95aa40aab704da2eee7269fdabd9b44732664c0115137274b65999fdb84235193ad21142262a3caf544bae7778236c28256de23cc4b7eb297542de3cfe75fd05badc24d767573d83487433b5c4035a82987d6e0557a9eebac923da753c638dffde4055fc5157b6f6824254fa50125062141dfde31dc686be168a8375612e3b26dc8240e37aa9f5de98e192bfe3272bae472e605c65a0b05b70ff232a8b692304362879223194dc2f564efb29f78972dadb717a259b910add660153183164feeb22c996fd2695f2b52b77c36d2b0611dd9f691033e807ab792b5aed0e15fc685b43c86d07dc5c261417f13f4e19eba3f795a8b38ae39ba6368f91797438d7719cf3ec2707b2e28cc08c40fda24b85751c659969e036f1e913faa26cc572803a2272fcba30cdefb7f748e40b3fa52cb3703da153b4ebd7e2a3c684970052fbcc49e7d9c18c9dfae42f81d4ca147775130c72bdc4b39425b5f0debe5cd83409af9d590cf3ff0aa9966265c74efdf069d89be02bcfe2cca4bc2ed4b21c8fcf270b096d3607cd7f357a403af4ca807d6e323648a6c29d79ed7e605af5cf851938299821b2afebd3b0ccd329d2ff9d01193b12e050db1f73be960213ede2734fe395a835896d8abc19648326373f549b7a30c5586a02529730c82a2e65e8899ffe65d5089e5dd3d2298abc8117c7f58eac8ac5628dcaecf4d75c07e1ecd29b06ff448c7ad98f51ee460fba39aeb66df57b0be4b3e4dec8cefa43a0bf5ffe88bc13a4974b1cb6ca33acf4afe5378661323ce62219ffb0523034ee5a9140f89ab96c260c6c77db6abad395f90f3d333708185e9c3b2a9a07d0a4cd49792b224ea002eee1e1ffadac7cfc717d8a591969084d8b5e8f5e24a4f515fa40d3763d4120c985d909d4b24d5f6491c454da0858ed427c8df12377344ab3c40616203bc3f78c527ed44f9e4130e571f52e2e576afff4754fd1e16f9e715f6d76b209cbaee0ac0778442b3565f319e9a137941617886da7f90c82193c70e644a82344ec05c9958c69eaa33596a01b7392cdd937cdd120f85549cf154b04860c19b7293a1329ed03c6f304968bdac5703850194a9579e9bcc278f176ecc2464a074d97da51ddf0554c2fd7bbe5dd875995345aa248b125dfc565bceb508823f520d0e8fa9b8faec5097cb5bdf370de46477b520e4057f3dcd77ad12c3a844d3f3e127e5281b454ef695215d0d49091add927f0ab3070cbe4366ca0801af0d6c72e54216476b6328fa7cb397aa66a723eaca05b11539987272df218f5b712e0e77f056f544f222dd613369944daead1085553db12da2d2410526184c053b05ac1d09eb175380c82fb5a34ac28b8812b5bc525f55c46452c658b9de2a198220371cf665a579ae5d79bd96404967614e7523e414ef11b4fd73e5ed48fba14b556c8290a5ca24f007851c7e6e835b3e3233fe7d9622fb9d3f5419d933fad4fa187ea3ba318f579035972837de21b5d2b9b55accc12746ac17315190274c9ec0e955e3e8fff78bb10ae8fc94c68f73ee705214f3b6712cb43e7d98244d42a3cd5109c0f7e65d916943ebff3a166cb3d71f07df4445322cc9c231eb6f5dbb86fc079b06058e5c5687bde4a18816489fa6fc25a70ae649864db8bea6b408f239dea8b7e795041258b8f8b2ed8507a4fbcd0f0ed2a7fd648781bc8b039b1fcfb0021a6cda5cdbb4a3499942dde19dacc5d17605dcb78e0165043472522247850799957b9704c7289fdb4be430af655c21bd18355d436c2d280ef94fdf5aad447256d8ccb788531c1eea949a4cc176a4ef2a0766749d2ed28dff7330c6e67baf94d14cbd329b3adcbd0141b2cb6d72db7cec93820de17f41c7cc964ae81dc46fccf4c2d63b4fa80ae935ea58f8cd4757c15ca812a57777babedcc0909f0bd73681bf4266f33c754eefa50ed86ff329df01a9a4eb6c3c35e448236c39e22fb3ff3b7e2cbdcad0792864112c1f3306ffe7b4d6f9a02c58686224f58eb4437f075a2c2215012ff41e6071fe53d16dd5f888a3e0c3badb1491462b31aae0a5a703e5af153b363a9cee40ff6f37172b28586f47071af3a98fbeb2ce2ef7b37231ed41983575ffa0e305330604fd1b890112fe51693fbaa01232e85385f0827da4473b81e3b2cc0cd696e2b03aad79224a5122a580ade6624acd4dd7bc7185804f3b86ec7ce43cba81d12127870e39154fa396f730abc0fb238e50c9856707530cde091104157a0b6aa9fbc2bd98af4dc024365399eafe7f1bd5c12e0dd9d2d9afabecda5d13c40fc90992bc4671527f5ab53b9014c448d363337db5b5d419a304e4373897616d7b50f131a05305b923f321a893412394403728309d666be79d9869cc24b1e14c8748ae0b4cb31c1bd9d29d4a77285b17861bbef89e2ce00e7d1ef0ff992f0d35d5cb56291650f03af8b3a8909bc3d06f92f4f2bc5a23ff42004dab2a73ef2de64b10c89174879f82bef9583bdae8bb759d70ef995e19b09fdda6c2acf276274b2482248cd4a76e3414780341fd22fdd7a03c70c232c43e8272a8b0c8b6df7ff04bbe6117ad87c37af4f311d6811bb8cca712191485d6fdd574b0e3ed18ac2b30bd4d7c5a379de404123dcc3c3025b56344293d0239cf22210ecc24ebdbbdf84f825448b347e833ac1dc727536b274321abd02d471565646bc685a9fb85b5c98d9e88ecafda96af1d925d79fcd2c37b001771826f4e01631f2c80d3ba28ce01a66783bfb3e12ec77138adf3ec0e977eba8b1f5bf1dbb336af20a793852314a83b91c9bc2effb67c7e328ca2937420fd200719c37a2af16d09f4f6b669082791f82a4b32b1e8ba5f494e54d293a988c0908bda198234949595aabf40de68c3604bed55a2eb7deff417f207b90497e503ad54421220c2e86d8890ae2c58290211446c115ae76faf57d353bb5c4b4fc96d62897f6a4b997951ca609698564ce1a3235277c6f94b717ae4bcda2caff895ab10b47401eb8a83af52d7d381fa85bad8060b5fb1d958f58d72fa5d3081775ec784029b3b8d30a5b4f8286acd24fa48a7361d4a40f4a28c17757cd7fc9988453e09fd824ccfc4afe45c7b0ead683f4cb1e0d12b52226c2108e7c908343f9525a4ee30f4460e921915962dfc472b290f635dd72ef80dc36d170788940c585c52a6dd6cf38a1e8eb0104815f7a9170acf4b47d3e250741b3cab4546ea2fa6a701768cec44a4f41d6da86050316834cd7b330bd2cda4dea1cae7c2be325741b6858adb036e29b66ff5bef7a965d0419d499634cd37ec4bf4e3e47641354bd7f3648a2e2d65c7d1addd68d49ab20f9dadc0211f780b35a5254e88283d3d88ebaa0e9fddf2aa2f6b8ad5a9f173644634f5ba76e7c52f13eb420f1ce8620d1f46162a7993887aeeddeef4279dfcc8a292f85c445c44a9acb1906b0b7368356c770b350ada2a0de16c4b35d09700be56c80045ccb404c24894dae151c6575a5e00fe5f35cc625d44343378456e562e03753bbe4bff39f0f6cab31351fd835bec9d3dc5b4eccdd7dc62b579d22ee9646e99abf8b4112538efb1dd63821e9108bc4d3b5e2a5ab82e3e9928282f72aecfacad5ae847a31eefd42b1f46c6269f69af171fc1086f1c7ef3ee0b2db3546562553d7184ca83dfdfc5c8de86fca2a55a54f4f41cbcbde47ffa1ba59ab0d0ba9f12d35b1403566ccbed349d2f10a37f4aa9284e1e3c1b46277acb4a85e42eab4c3e9c502cb2a12f86f2437f54284e24590f5106f9021df3ce65ab77847a14e090e765c2999132ef5a7c1e7a359840b9f1d6c7ac8d6c46397ab6061cab8a957ec94883cd2b20274b1d2abf9e706bf670bc7198f87a7b2c119edd8597bf02d174aa1420a5bef2722c406a7905fa46e88e9f4c0eecb3c8499149b2bebfd3db0806ec2a74df7058adcaab4b5aa11be661f67ba2fc03520b7607c569d8326389719182a5191278fd9d3a10e2bb12ba478b484267cd6d93765b500a162f1640b4a5fb5657815fd58904d14b99902c654650fa8f1f7da95b5c26ea5dd7291bd5d27422c247cc29b22d94ab06c5d07e7e36acecc265cb6948c7b29f1c2bc8d5534a15ac874c7a12b91fac793ecc156bfca14451e686dbc9319cdbfff53fe3f758f2080059b054a4dd6ce69d79229d46079daf0031381c52f58b5219b5cac4cfd14f0c6051e32576e56d4b83384b2b2dc27e346b08d6321f399ae4f194d861ece71adb012fdcc68690c7448f2cf432e81d77e00c4ef2f3c59409c3887daa35b7d81c2a26c295e812dfe38e98cff4feb562968b792b99bc4edc79229f22c09848bb05cfe118c73c60fe6c9bd9fe097a4817994ade5dd62ce117e00d2926dcea1c8cfe7b91b2111639c384352088c7edbd9b8718d48094a82b799cc359e7529db9e640b0d1edd567a46df130007a30917f9bab0503ee4681930c1972ee4c094fff2f6e101cd84dbbc6e3d2307e8282dcb24833a063d76e33a2a67cbc5d2cb9f04411e66185bbf3efbbe3f339de906e056f412fa210fe5dee5b1082fdba2bea55b3eb9f6f6f2da296eba3e3b116c26876107b91b6beb97f24730fb71adb94c3fcfdd72e9259a07612c901e11e2dd481cc790f4013c7849b080811f97faae4f3d738b2203425a5a5e18d8836edec4b1f0c074b83863918ef247ba2aa342630dd1639421c3293893ead991398d99f5a08adad211c2b6d775e9761a318deb2efc580b0d9bc12552fee70d431b1a7a16034eb9c0afdfcfda474679f77f1f0ebe38a970053b08aa7417a8461ded1814149167104a165391a2c539cc0061351d40d20f450e55f9a75f2ea84de41f86d00e904222a0d82903029749f7103ab1b47f62f0eb766764913ec41a0796ac924b67dc2bb34f642076a3d51b67db855b863e16d2e710adaa3bc374a073bb5c333bab66c3e548857d828f057e761f21f7f124fa14442ff49e82fd9a7de661107de35067dbd5149dbe6828d0e4717fc1f44847e2654d3da19e26d2adbb7cf53b51c23f63790cd35c9b1db6cccb1cbcda5a2bccdefcce7b8a7828bd6dc1c6ec4dfbe7a9d371bf3389335ac7a177a133239c5bf14d6ff848dd93a36951dce5eec49978522ebda08d480c129eb6ed6fa44855d952bc379c372a873f9e9dff78941b88464fb6bfdd46597008dc3394811e0809989b0ceedd0378519454c0d11f4a23b1ef5b45eb9edfb08f6a90780d009b997d8f4efa52765d9d62d2bf64ce483ef0db58376b747a3dd3c18bc4d45d8983676bdaaf247d5130a6d361edff29a70e9ff342b3e058b88911a8c9a80c7f3a450f3d332183c6376019d6a011534140fd9101675a2c7dc1c2b045cedae058e22b126613fa3a722c22102205c2e8881884afbd39ae6808f871f8a6d1b89f557c9d39fcef2f8b0e60a60223f0b825f3c05f4bc04afb611f0a3b36fa7e4b4f9487d333db5b27eb057a9d3f3b836fbf3cb2a6a6f6b56b100f53f37c965a369f01d0a6728c965b86f661a70e80c9b48821b392b2e6a39613a4cb71f9f0aea5608fdeccdb00d6c01e07ca099f116422fac98a63a684519b4e9e479ec87ba25b339b1a51afccaad87db02b66ae36b4c8bd147e122a4ecb1533e2c43f35aa2dd9ecbcc12c52d7cc7f5e3a38877b985807c31203baf588701c67fa283e92d5814664e20b0beca6e3a01b18a4d7522557be96dc5a4cca79a4c341f78b5c5b250153795da941b27a91cfc0906b5005ccbc30192f0ec4b481cc463bd2383dfac2459ba8c68514a19818aa999a3367ce8c0cbd9d052a94297a82a153df5d5894ae8788f405a68a42e71562e205340775fb34a6bff454ea813c1335ee06cc2664e6c9174a6a2b515a6068e00d124ba237dd5dece341b328d96ac02c1719cdc8f40b13514432e6a6a97a6547015d781bfde510bb3c5a954489918b28e5bf9b460fb242f7e5be1d9ae49c1bb195d46835f714867314a1e3ada5fbd1eeff1993970cdb4e68fa64e711bfb0fb627b504a1c89d6a2362e75ffb5e3fc177b5b9b35424e0ff9c325deb9aa9d5c9ddee0acdcaa49df2c8dfbb6f3c914937fe8731e4057d82950a6e6755b70b91a722ae0bb65be4af2cc78bd5a66b6f8f513f3f6355f16a01fc512ba7f5f73c2672c3d9069da1824791bba3ed91ead919b4cd2e37dd6af58177db81f28b2f205b1fc2ab061ac25f6081f2e7f513baf3d647e188a8806de44975d471b15c73c3e974234b08d1e14bf32f4f71c7a06879362611094e73500b096cd9847a1adcbffc78ad23224b5d47452abb5c42c1f70010c2b05064bdd41b6319bd86d8fc55d57c816b80409223eb4f80ee5d0314efc7653da61714308d58be3d9723cc8eacf0cdb2dd2609fe8d9b96e11c942f0dc5c634c6a9cfd51061f14ed5e85260cff2abf8ee7e9d543464e1cbb6307af7f3506fc97685269deda02fddc7fd34a81137ab45aef0c56de4513fa0dbf14fcc9017cabaf7660798d215e30fc2c15098bfd9ca5a356e6acf324ff336aae32c379dd34f3aa827c029f284d23b50e44cc0d1984ca7eb703326c760ba3e087e300b68e0800bb2ab263c6acd5be18592cd5dc8ca6c1d286263df4c3141c192a26353512e34d29468a772070e2480a11e978d578748bc6d7d26c80e2dd1df8a8eea40ad8a7c70db899abdd0fed16a82d02f6ca321d35f6e9ab0b1de60a1c0788a8c48742cf71829820c2c53e54d676530fdd804d28d1f96bdefb4b6f3f7c79bb20cdea0b1ccae751de502e4c431071a95b89186c98bcb7c9ae88171556aeb69f702a6cc099c281ccdba6dd137b7c331a32360c0169bc7161def36428aae07e1be1fbfa08051199096f36530bc3754ccc9dddbba6eabacad2175ce8dbf35d60f39a1d0fb95a7de170fb9be08e8e74a3b07f99661a5b5fe77cd969c1ec71e2be5c41a29bfef0f3bfacc6bb26502c8a46fa39643085be4f9386a09372c46ecbb481d06d44651f4821324f0025c6835de18622539b49c95c44ffc513b36791e5f13a85373666bfe9d0a892cce5e527f9bf2786693a5bd1f812e27b68eeb8afd17c2103b1353814941e77f269bd352f897b254ad59b30faf9dc6743cb40dac2d83707bbecd613440e0b677f19ee7e85a452677f0bc0ef9473779cc1f6ef8b4387ebcdd09b42ff0c6ee1680ea7127eb273734acef656af1589b81709b34e487988a96072c23f2704b1d2914f7261636eb28b1480dad096ca135d1e1fcac0286cad070aa981c300fea295fec471c40cf82b3ddf20a5f629966eebff790bc3e8beb3262ebcf211b0f803cdd731004311c78baf9105fb1c74a98706b37add7a69d2b705137f548e5e8be57623e8e89eddecd31b087fe8b836b84c95d24cf44c8f63a5f8fb06dc5a94dc4e4da37d830933cfecc383afdfccb00c7a7d8dfec79f5ca07779b02e001ec0a4f546f804e02402b1e8aef4b64e2a547fc7896cbe9bb3c3fb3a25228e9da4c57652da7c40e981b4c64b880a202dc47700998ec8277a8bcd1a399b3e83c55159af83f890f126f9ea0c323b89658160e9826edefcd455ad173c448eb9c9d4fe1d0037de3d63cab1c6e1b3ff8f8ff13bf04d00527bb24285e76d68c3701fb1ed39197c351aa2bbd0c9e6125ce9713b1c630bf53fc453398583f9c2b12cc42dae13cefe4fca6cf25cdf560c82c2262b8d308e2bdd3a42d2436389ba660c6d0db02d0c5e0e66b9c674306faca4a77ef8612fc168c9642bfe72d0191c2801019829e5c6936bc545d56be6f517db6a888328d04989698c7ddcf9172a86763d88637ef5e27002fdf431f0f7bb96ddaee7432e9605e2ca15940fa144c3cf095f125058dba66f56e49a0cf99fdc2ea65a0b71245c584eb70af381ebca82fa6bd67b2b916231aa30a53b49c916e62244dfaa0799d3c034eeeab1ea060c38d7667d0630f5fc6fd07a659b2a82198cc3d47f2090ad93b09ba478162706bd4b9d455f0f88599a533a179f12d17a557bb8a8d1bf13ed1a8a9c7f2ca4705e2603e7bac165e70fe824255caeb3f0d375a12cc4548d5832512ac853e40cc4246a87d9fca549092bbafa2b7d231db5f510055e2035af9dbcadc6dc2f73077970d49690fc2f6447d9d45e8922697004f50ae625352c96c4206dd500ddea2a20fd539709eaa18b5dc2d6c5ebb89c884da043ae5b7ae90e2d54f6f9e7741eb12c022b00e768c70b5b8c5fd855eba2d14929c74a6d87805579c7b69406cac3ca81ad00f7e4a8e3a1e8d99cd38c6e2a15e023132c172c5c138ab936bbd910c1c7025e872a865cc1c723b97c6d0894b051f378466f7c6b7d52a0b28821f549bad169ee4e00d7ec508f54b5a839f681a43de0aa0f995d9a706625ff67656b32df0422cbb605654f5b4885708ab1dd519e4dc2b55c92bfc8b3b1bfafe94d989ec24845bc3b85a5947b28405affb72f72085ec89b528479f0b7e77f74b2752e38021a00fc94d736529e5d73f649351ffafca398d27a86a18395c7a2a71bcce671889664b3ca3714970499000e7d8891bc07ed122088afb64f7c8584bbef546448d228dd8d59289a76e7a0cb3e626149ed75cff596bba40fec966ca0c987e8c6023eb29e348ee4c7558dc8dbf1d9b71f1696e7dfdb2f58bef9c7786fbba685256f3b4f903f5047415f419b167973fde82e6732fde90c1b49298c9f5866ed549dc2d1e4d15b81e23c13826f6f1d067434843bd3dab92b34c726ea4e1a3e5336ff6fe34c355df871e415e66102ba298dd16a98250cdb7a753176e0828143068ef905692ec7406dcd2ca474fbaab1323e51d3cde82a6aa461eb00ef7698c5e2afbc50f30ead3eaeb2f7d7db86738ba628b42cc50c02318e033956bba288822dd8b5d02603bac6313c2b413aaaff4de5352eae1a44673f366ff13163efa2323a835abd60c9651434ce442ce20947bac95f7e2f29b44a46e5660e6ab392c84c6e15d680831ff662f433d326ed3119f97ad72e5be566a0cffa4c405b6662e602b236a652785c0a8c94b892e53894a3b53363a2f669bd7d836499c34e2aa0ea95cf3c29bd2f53ade605efbc7da5ce8cb409c2f283bad04a66a06721cc8034d0e01a914a320a5e9771f8b47fc47d21ecdae23a2d6e2c9aee2006a31ad477f268da632526fa62529788dc1e1b238029e0ad13f97677d600f63fb1ed7a32d8a418c8159e50d8be46e193d79e52023a6446b5da3875f4a374ac5aeb14733e00d922e16170a6310cb15cf2b5ccfcc7d2f06454ef8d0a21aea4543e64a5751b2a9dc27ed44c4f6f080d575c67ba8a6fd52061d67f933e92d3195baf1ac744869cc1742bab28fd749bb3747396e0d91ead44682cff727c2c91c6e848d596209a32fbb50f3fca1bd76a42f2c54f5a04068d2fe0d46c3bb3c0c4ab3520f1e532f3acf043536852833a62ed8852841915a449570f85782658eb761edf33919afa2e23e3232bd16723eb0d0d2fa734f305f243dddd8a8946b6bd3043f33dbad587554858c679f42af62ea091cf77b40088a8457637c29f2ec1ac8313cc1aea3673d4702c40a2fe4a0684568a47d58855b7834aba5874576899c9bda466af94775957ffb2a685ba61f840005c2eca2d376be529a33f6bdc123bbee46a54f7dcb90df319c0d5aaaa093ee8c92cf2da8da4fd5cffb0fcad126ff7bc808da3fe4de8e66a58ff0e4a06a6f955d53176447a375868ee4aadcc5621c263a9f415ebcebb772c18518267823d60d39e8ad8680fb8b781275a0bf0d270a9af364bbf4370cc7061688873e6edabb46e35210cf35bc7ccd179177e7a42de98b45c4c0720cfeaf3523aaebcf96d5841de39900b7fe3018165a7e6df349a1967ab2ff53253a033d3616f45d66356248f80343a730e488784b2a53793ffddf93197ddad7f5fdc607a3398d57a5662c066508230083d7c9caa2454427548851c0936548ff609bcb062669dfdc58ae267f5e45c51a1f940df7a3a2387708b710fcdffdaddaa4fd3cf7e7843591b867ff5e060f050413f790b9f7cb3759949804da41399c49cc9c2f30805a77f00159b790ac9d29b2deac268ef45a9233f52c6e489545cf2fc1a4b7a4adcb97e0390dbbad5f7d8742fa6433d3c8ddd46e2899bb93b5b6d6789f1ea610a4e64a21d67ef7dbe958fc20b7072774aafb59e882a95a4f0b8583bdecd0a473dfcf0ab2308788e387e853a4b55562ffa4d8111503744f1f34f77303d690d3a101df3cbaf6e1dc76746c93ba6199fa866c1ae141a9d7bb0cd0005292b9c880c3b2f6e9522d54d3c2c290fc65f4d9ad45597b2b3cf0e1e98ce4defb3cd20406c1adb783eee8523634d159d4ddb65611902d2d6e829cc58bbf94e98074e927a144c5f48d3fa8245e03abfd90cc8d565f01272a2ef8f8f2b3e8f9d27d52ace89f0cb4e594b48acd9425d8b73ff12d0e1118cebb8bcd409a760dab8e98f5dd11b85a3abfd1bbbe8dc95f2a8a855ae72c83887ce48623fb448105c1f2015115c7dd2b8730ea5032a2aa63bee228df6e14ff65addc4f646ce72345a8fa7bb503990e488e61b7cf14579d86a86c5a888accc745d7eafe95cd54e60905e4488ee517c7589e917c1c99a350206403052f481a6dddecd49debaa2000db3a58d91d122d6e4a27924cd7d2300f7c22bf3ab96332cfa80636522595759f58c2eb132215ccd84d3cbf5f5eacd4a34d4253a97c331136fec0c063076491aeb05b7663cacb163ce67e027f26b35b4e5060d2f38a7ac3fbabbda929f7bc9c4dedff524f60f69cd2723e8807d56eece79d2c8362832937843213b7922aa182d501f7f5bca95898a6c9f89649c32787fe93fed767115cd17ba1957cfdc9919c5b2750d27b3be476db494411c0a390dfc9c2de47120ccfb7e998e1ce20b764a42f110473c3c8b7d515e4df608f29f1d8b6643351b814e77304b860965e92476059524bf215ec61318dcfa4eb3356ae665259406ff9985b56444950af10a9e659737eadc8245c3d2c17d56a0d90abf31137c19a8824cc358d8f6e37b9213455ad9ed23143e2eaf6d6ae996fcf68f840ac24e8a9f9379355f48b9a8fbe81406d6716b93c9c462a8f7df0968123f97878b16d1a11ad4c0a18761e5b01bc09ab015b4b7efc8883bfb6ed0f95f5ec4f24d94f5ac2c8df926cbdd70c194916b7c7cc98dea29122be370103df031d5676597e1737c683956701ab75d8bbaaf65a07d6fa41aa56fdeb2a94e3703e84145a3e3fd603af142a40941d99f4f9e56a85513f4584c4360bec9247ce7910696143546f23289dda90785adb1bcc369e0daa6742c2b0d56b0160efa5bfc211caf7108e26edc7610b0d47ae08e86b74132b6dcd4b4fefbefd5eca443c6ef389b9b8558b5ae581f835e160a7a42a4e0368b9a83d198d3e8087fe756ff08d0ecaebe353c7fb3d61ac6c10cd9e99d08f6185059038017c337b3dcda2aa68dde1b53dd84cb77b21025d92963eef19a9bf797ffaf94c2325fa7b020891396f8e4082ce3ea39bcf743bbf513422bee25e22e71150b0989093e3ea32b3dd3d2f50ba9c0352defceff3926af05f82e7692cce3bb8de8f6b6a13d0ba46fbacdcd1494ca7c39847a7f923eb9d5c3012f042a56921128d2e9519adceceaa7b8b65a6f1ae08be179a0d613077e0e82734d9d1f0772697139051ef4643d0bef8e537423151e2e2a65085a656aa69b6b9ca661e8c73c4d8a712b352b720ed20fce3b2939f8ae2e0dc5c0cc4d526c460f54f705110c4369a05faf7337031fd8a1f5cc09f84fe9ee96a5f0a1d012c5029c783228af172170588ac13c0017120fd69d3e5690bf3547fcd4f2444e0fd1764afe5b5016e9e7bebf18129b639565d95158d9a7eadfafee0067e071eb25eed3d992b3c9e0856a1040c06ffc17c3ee7cbeb0a9bf7e517190cbc865b6b31ea350cf75292895c7039c357724548ef2bb1c462f070d04c970af0d288b8d66817dea6203d9374d47d9f43db4265ea6df4b0cd8d09747175a3b2ffa51598b6096da576e7a4e167b0c0a48d1d9796976fccac87ac6f81b7a5eca526a30fae89fac8f65ccb5b7e539e742ac9ce79a83fd78820d5f3d4375de482d767ee7ab39496b8a4e6ccfb8de95ccc9274fc02881b571253f92187ec60d9055dddb0d2fb991906f18776501e5674a04f4a7706038e80ecbd1c565b293e6bff60eea7d4ed22ec7ce5abf5fe77c94cc5e028c643d9abdbda899e99370387a41312ed32ef179783de6983bc6d32351297629a4073b4127780a15b62a024adafdcf9c33cdb17637c8cfa5172b9767f91bace4b0301a2de914d62320fac1bd027925bafea3509586bf73efadc350b3e5e8368c70f9b47cd3f8edfb081cbd6abb13098dbb95c09f741977a7d607412a6231656d72d0e8b2c791b2c621276c29b650f6067ea1edd352bc72613aebfe3c87c78f35b5e53c0fc7f3e26df076d2c711b08c9a5c31541c4bedfb460dac2d620ef72a238c60b1d9ff6704b58e1b57f533d6e91e14adba866aaa1cffad3108f5454f7dc2b1fd427e106b25e325d2dc3514adbb27faaf269d50837f53ab6bb953bec1388121441fe6c55db93afcb839149049ce58b3094c75ff48095e83d7edefbf67bc65c1f6af7e7bbbefacd0aa1e9989dc85068e291c6c33032715a583d49b46068057e5f09781930e2e67d36e969ec87afc758315246f591bec4ae28f60036b970d75e6752c1163fee04582ba436d62e732060135f332f1b2d576bcafeccea1ca9a5b38141a6447a348f74f134cfd38127a0dde7bdb30544bf6d2d43c6882901d6bd927254e1c061c0ae9638125aaf23e6c544aab7b88202100ba75e6f3487856058d50abb7e7488539d1e89a70d2768afd71e3af15d4afceee0d65eb37af401bebac1a53ef6f31e10314908ba50e849b95320302bd63468d2769f999acaa612cd21dcb088676ca725fb877e6df917dc1fe9c846e891fee9658d6dadeeb95efc435a474b391602fbe0ff55e37e537b1ab14e49c32a1d44680a822592cb1191f41b8d5e22e28e8182dcdd6b0c97b08e88a4a2e507ecc0bfa348ce827227367db83d09ba2d1cb578d7929243dcdd9e1919edbff9f8c5645b4557900e23bee57f7f2234fcdc42462012c1a5d1b16cf81e5bd4e571dcad8df1841336782b2e8f9b35969314557abb4594f91ce1b7a671392d28e4696e57e2095608389a8a82e4f5a1247dd81d12b5c1983fe6ab8d397bd8af8cde0fb57c47ce6e651924576758afe993374e7a7e5f90c02022fe8561e998c2b1ba668420d465199ca9d6609cc346c7315bf9596b7414db5d5c6c8dd51ad9f14953ed07ab17392c65f1abd5f0faa4919519dc441cd4e5da25cb73f35e5e3d33f1984558fd6162aa1e2a712d1f4786b3fe4296a23d0e6bdaee4fd6a81cb2abb5f3551c935e478d55bf6785d63072a4da272a78a0c63a3610639891a5870e008bc894b1e6e9d30de85ab658f5661c506350394a1c7509c5606012e97a524706f6ed2f4f8cf489075c2688917e2500e1ca0d3791da9c1015c4740e2fc2083a756f8880fcb44c81721199d769f97468c048cfeb8e32b0ee914e9d4dada4fafe0893d5d2f0f5e557e25d282d85e136d6fa6cea210981f2957329763a2af8f200cff9dbcca490f4a8e62832538a63b34f6afe062ce6062a9669ed5c21615e21666b3958b84d28f1c9bc08735e8e744faab6114d1912f8bce2f4d7f564c75618bfb7d6d8c1d6b303286251b2d21f5e0669362cde2111345e21c7d9488e0b18be087873ab3385c57c3608761469b264ae1ae53357c37e60f969e4f19b56fbfae0d35bbe62de48988e0ece10924a1438ec98103b1867125eb78e46ed44eb14a797cd551b450e6123cec112be6915bf40cb5269875d3904bd3cfe7b7bb770db1ff4f6de5601c6eaa90ee9fc58720c139525a75e102613e2e20822f14d19f83aa3572c6878a4dee2249852185c4e1b74c6d8c43350fd218bc58e802212afe246623d5772d8c4617b4ce9797f60f5482add4794fe31fb8301cbfa0e633db18efe3073e969c47e79248494f02b1f818638bd8edbd092795eeecd9218700d63e02b1f97cd9fa9caf1ac0972151087f227c9d47463b0f828af90d0439bb8596276c882f7fe44140f33aea3fb3a589c66de9e53e83dcd4d1d1e7914a88d6dd42f7906cd1628193d2bfdf9d7775ded2142ce584017e6a9d61e1cc1a7b59018fa584059f68d81ccfc588d123e1ef9a9520dc08d13f703f06811ceab5eb19b793c8d949ac6ffd8cc13bf497ff21889ef5e6df022491b274b1ffb4a499009299cd3da8d3025abe49db654a985e10cb5fec83a35096567d4364ea8387746ea66e6ec2c5aa636bc3c49e4174d403a7f1931f536ec4cc1403805b7acc8fc81a285e56ba933398c78d0050c9e50a332bba2659ed01378520cf32ca4e4dd5da2973b5ad218b142599c076f67cb8995310a2e5710b643e465739bf37756168c302002746403a96c4cadb365af0ebe6e66ffcb1655165074b57203985b1f59a3981ab56a039739f21280de939cc188752e9146313c9dd5bf503d5a976d23e8cfa083489c259123412f8de3dd9c30c44e8ff1e98102c748de404b44bdec179bdd6068588993e0fb7b5a93f82a96a3b766aaa7193b178c001464fad72ca8cd3d6211ddf22d79e6dd1dddc50ba8525b2f54416dfa1394027b9fb45c9d32248ded7ddb6061270eadc4cc19bb64a9c764529a5de205bec52bf89244885e84080122e47445bd4f201ab1787101943c8446e001c94eaaf0a851568c7427710f9337e77a04540eb2fa15a1d2764af0d444a61a0bf36eb5cae3edda200083e84b3d982b1116123f681b538c69b69db0fd6a114e6cacc335af54a4f1ab0279327e27322b8f16341feb5be976e63bcb1f8614e6c8814ece2d9f598033a70ece9af38289907dee8dc0e6336b944a9d9ec2c99bb0255f4093af27dca5f9c6a6f61fb3d7a999feff3f75ba7b7813c7c73e16d423f93a422d79e0266eb39503a4c1785f94e5244bf095bfe1ec6ba896429b57b99db5000a637b0e86bc2fdd89983397c711aa69fbbf6659cb147e9f4188e619addcf8878ee865b0551e2c9fa679c0b8e04d2e6eca0cea2483d1b0f4977d5257e42e565b409a67f72d1e8c867076e47f2c93962bddd89a6427ddc51def7a32e52f0771bd01969b9f7a3ed3cff096557ba0e498b63b6a4540fa6eb6e8d1d305ca2528a5ef2e52c38416d477da0685e84bcb1deb0080b22e7329de8e3fb77cbb24d1bb6c7976c02a8f4a697798369640929ba86099ea61d77b111175fbc84697b4489a24ccbcf949731eca0dae37c0ed1b76f5e0f323711d37eda116548a6ec563c612597cca8599b1cae6be09bc4247647acb8bda4a5d125240ff3a75a4b4a229fcbc610a02ece1f658d35a8b7a062471280b92e26c9ea78f833cdd6f1bec9686d47e0aba97bf48c24cc25681d37f5aae8f8311928d6c599bbe0a87b5a67cb23ae4f83f60d2125c2e529aa1402373d3f70ca0309c742f3524dc11c8cb8b12078e21974f9fff0ae3a5d443501a450b42074013ddf31842422e8303797012abae38df8c9a56f41a70f695b76e6be6c4fc634610b17a15586b0168aaac4dbb5d66962226aacc2dd768153ab26b4d858297750340da6fe689d7d041348cd87d332ecca709a7a3eabc21ab9a8861500fdc69de352077600926de24b84a2fae284d153999eb3373177a2547e40d37d5765dad2e4aed23d63e1592f037fdeb3562403c9bb78b0185c5ab46e34e693e5c611eac480717165ffc83e5b3ae1a8ea2690f4ec0024414b64754b8c6d503b7ac25124439642523e969e2ab2f13a1aca5760cf49d2f53a4108cb2f8d9c9e6c69c7b0a11d27236433bd728518ce2fe8fadac316104bd9ab12b53e8c5a580387df619b995848b0f977578be4adccc0955eba8144c42e841e1a61e94257f9e68ddfd90127e9cdfacd08fbe356a74ab3a5085d875372d8a570cb0a6770bbe494285d0621057332e0dadf7144399e91b5872521b20c62e2e3a3e089cb1e096e6604dacf266145f055422720e956227b85c48e6c6c1b2366dabcd6e39a11d51436b7a2b764bca1b5ffaba94bcfa0d87b65e41972569921fa6b2312e6e58e614aacf554f7c4e9429bc9d24a56901ff57b0f063c42e56533f54441390380446f62d50f2df7ba00f6946848ed718cec228c3675dcec2fc2d54faaa7c1c724ed5e82a0f8bb2df45923d93933ab165a3a5139ed8a44018f85830ad05ebe3b2d3a36b993e2f3c2808566203df02575a53317a997b7241867b2a219203030bbd5a72f4a2e4627c16838f749c1b5b57643f79283c9f1bf08975bc8a01597c902091cbb099aabbccf09009d3744e84f01b83a442dd9b82ed2d1e8dc201c81925aa3392793ddeaddff4c1a618a611d2d19b0d372cc15afaf85e6e2e425220295b7503ef60acc211e435d8cb49562d5519241b2dd94c2302803492af3af96018a0c6a6640be836666e4f13b7e19a3f0e6141e07242a8b04ccdecbeb046d7b21118265580d593700e9be68c0850df7e2401cfc69718e76bb2b7f59ba2c71bd7754c3d0f3db4004a736c54e3dc4a5a9354112ba6aa811cff3651311421d55301e319af16c3a4c0eb6b57731b70f8837c0b696e9abd5e3715fc8c42aadcac2d7260db61c571d1ac3e72ed06b69163e95324391ed436f9ba81e0ec374ed8f1a994c990b925d14fb6ae2db608217683234b8a8905f1aa8abc46aa76e59da50cd3b1a9553e2a761a230c68a5bfcb9ac1bc91b0ddfe54d5f5f0bf2f13afe3abc090dac569b569a3cd429fd364c0492cca08db29ca45c8024512fc37eadfc664577fe93c476267eb644b962292dded770b3ee154597e047e7f76d91d34d129926b283616718eff03d5fa8ac2d14b9e738d9ad6d22c395a501e7a29878cf875484a1ee04d8842a8b6471e7afaecccb9bc42f360784175d6c6d2d14ed35a30f119053dd8630d913dd315d14ca5854cd65cb4c8c509ad6a6f88b7d444baa30b0c9713b1e9c6087e618695fd7707efdc7b5ab9bfeee09de44bbd5295412703cc7e5320d495717bc2c8fa8307166f870f65eb68a17eb01a3cc8c28f861eaf86e012379a38ad363e3542735f7634e87a5302fd36c27db12be192e9b563313ffb768757bbd126f0fee9e428734c44dcc3ca78b73cfb616dff2211ee5ee1506609df8c78580e5510714389187c5753c408c96d2180eaaa6826e3326f54efd7fc0ba9da9073ee961ee0472a849902296a1d724fa45cc4d4468b86bf6476a5274c9154af816d8f824b042987e8c95a8dac844372b5a9fd79279e3196c14a5a999a567e9065493cd9abb341e121a9f209c366cbba46b57b440355a90e891f5c30c6523bad694c6c8ed43247af4a8b00a214ff16c2ddbc490ba54dd4ff72b023abac2bb6b5e42e3409c8b6eb53d35400c2a88239e5d366c88e07f89691e1c0bba7ed1e2d73f06addbd3529e9b08d8b76538ff957aebccbcd507031f3eae2d5e6a385cd5f0abf87763409c2259a12cf2324df5baf378ce0bf2ca78af7777697fc946ec6fe61f95c9ae4129ed121813f54f727899dfc6f2d26189cff0839fef37b8dee0c78cac8c6d338350f56a6fc37bcc1249db4da41e248c8dfa81f5a7639f01304f8d8e34275b4b5023921cfd1b54f72d431cef5b667fad50af62e89e5975c34c0930f977e65be952e57beb1283e937d5935fbcc0249346fad99c70828967e869b6b0782b95c9053d3653fd879494a88aa1c9f6b82c3de5717e5cd840ff4f41660e9d7d882c355119b4f5718c1b7b27d6dbddd99ef43ee58e707f80b718be04439bf20f1d27b99d9e218e41c0663b94c387e4ce2c0946ab3ea29dde13579ced00f91ae23cdbccacf2a3de5c8189b1c66a198a8960eb02fd2fa2aec96415d7a99b6c03e6f823214786f9a77a59c40eb10ade1c925dd06a5d159d8200f07fa2e38d91c6fe91efeda8cd8885c39a15e3b93bccaf6cf8dfcdc7fe82e060196034c2e24c5e928b8b6bc1b9ffce12644db032fe9334b41dbd37f929910f2716e48214be2bf05c794b972eaaed1bd4bbbd3ec6206617ff524dfa6baf07179e28287a7b416af72e7915541bfdcf727d0e0729ddbcd05f0156841558ff769c1bcd8b0efc39a2fb2fe1d498e43ba0445960708bd1065f9f2b7a00be3d6916e6d130052a6dc1418a597087ed40824d3e3e2c7b561f12637bd285d3ddf33f351c2f344a577506ef3053b95f5b197f24f75faf14071e551ac71136f805dd6a9d922597142155f715a1ada309398053cd442e32068fa08eb3288a29b8ed8e6da4f8e667033d4199096b7c93119c4926fa4e79492830ccc3382844f6ecbccb06a8eca488b0d76e00af1ea7622fb14f4de2f2a5106777c2b6584ea45c37cb8a307c558475c324646a7ddcd2f7d281991a9b7bbc2cd28583d2b8267204c6aaefba2d59fe02dd981609ddb2fbe19b8ef46da295c2095c53985a0f7a8915cb9f0e96ed41b455eee20797c70203af129d8264cbf840661679c626ceb2eecf53634f5d75f03e69fec4b9a527abb6c8fcfaa0319bac9cb248c73307fe28f6876ef9a4241d295abbd187702f8e4e2ef2d6fa966dd53ee4293bbcb9edd562eeba62a897f42ec0f9ff55ef9d6ee16d6685aed22100611579a60cb06d33fac2ccf9ac6f2f2a518f9f7a048e5010237ae257d602382614f2e4bff11591e51723f0272c76e5d8b8bad9ad48d0959c952c5a0fc9973c6e86b08c94d1ec5f6c683415af7de48582ffe5b4a8ba8e9334f316aebfef2ba582ed6df6bec32e209ca3146354f671d39e5bf6481d9725cb6a94d074e12a0b5ef40f3a463b54855c2024e644b2d1f7f96e0ed940cb0824e1a28ae22fbbdb18cc5968ec8a15b81f961140afbf3686da42401ff85851a02ab0b8f47aa889dae952022c622f973f3cac45e4e3303aa80150858d019361f2aaa17484d8ae1866c0943bb937eada7f0e4d874fca3fd9d2af91de725ecef740a00bf2a5176172b16ab0ef2b0dca5eb2d67989d6f38e03875c249cb092c58a9f145eab77b3a714da5c24d7b7c3092d51898f782e79eb92101207e55582203e33869b7c184d640e3853abe2f271786eb548ee6fa9bb6b7c9d619a8735d3b0a99d584f4120a38537bc54514cef8d1a9ed216d9c967a6ae67210ce53497e38ed804e4e32a1c33e743fff9a5e6534b5c37d4bb9e5bb1b55b9161ece587dafb66d8ae7eb9cf9242a96bfc40794b53763162863a25f4df5009bf1ba0038c0ef8b3fa22832e25d751a64fcc705438289c5e927de803e944693e5a9fabb8a3ee203fa1cc600da71235567d723ae97e8d79e1297a99b560171c909e1d7a6658eaaf57145f2238bbc5bf276baa6b390973a2589cd11e2584c351c8fb41a05475066c55f47d7e02f755751ed1fb200b24c474469f52489acd116e598df767fe8dc85cb06ee713ae48265362844995c15d591554aea59877e44288f774f3d520a3f11fe306a70d64239e1925907a73a0a854cbc76345d40d22b940bf380ce62b203871d7cbc62cb3d4f9aec704695ae7e662bb95b4d60db6a36b4188d29785382c3132edb4209d089649448e0773c84ef017e387c294d37f023abdcfef54c8bb401b074fb3c43bc8894c9062990b4316a60bc4f1e99ab193e2168c4277fa94b621a18b5d2d1407543292699f176884ede892fa34de09858ecb2eeecc8d2975dbe390b4061b62273a0f85edf4b858ecfaa9a640d787f26b62c80ecb4da860d04bd6a8902f5c05cc938d6643bca886b6c437fb8eaf2dcd06ebdd3f4de6156af52db8603c750994e29ac2223d361c3c8eacba0d4c4525ff6d4d7ca258458ecc2dd8aa7027d969874997c2eb1e6f48beeb0a66f94e145c8b832b1a7a7b984da43ec2a167e272b5bb6f11ef339b3f9af59c9fcc8b5e31a5b4c6a2623f49157891b440434ff821a295e17ffb1f58a9bc769bc8bfda3406f0b6b6d5add23c3f96e91580ce073b0e336d1aad7a6846274e43cc8e63d9f0e2be196b8ae8412bf256b700049a993ef13df28c55b4896b7222904de27ac2106d0e0377ddc0d89fa3f594b37be1d3456a1e612a5aa24d191d33befe54ecea37ddeb61ae75f641f1882004dd67b0514c6dc487e896a5c751e9993291b75be555e4fae2df50a00ac1cd40369d3e475d6c3c6ca853fe59ba0c4ef954d47e2c29d240c8ce5bf1a4d3459664f22ae06286208841b1076b0a77a6d5704f29a0b29d7f079d772b97c7171261f0bb3a38519778b3b553154c708623feef4a13995427927cfe392c3c8abc95f58d25e8667b03c1790f8e894fa5bb5262637627eca953bf4849218f763c81daf89ef0d23bcd1a1552ff906571b01cc04fb1a08c2765135afce4ba80fe1db83a246aa650cc188d5accd3a8152eb5172d99ad3c4fd98ae01822c0ffb463b183cebc9498f1266ab6b29a8e815894be17b375054d990faf9f738cb6446622432420ee6d5bba3231c1330d3088cf187ef9e14c9634fbcee9269f42736b1f0fc2dda5a2d59dc806af7574af42686c229a46c3fcc5994ffce2f6293f2fd10c2fe50db1280c469633061063027f09d49675495447450787d438858c322282ddfd73ad4ee2ec85c7788d7eb0ac00c573f416123176b758961156387f1ccbf98df63cabde4a37bba869b38ad8bc26ed8a5c815523e6c94c2540ed7c343e9cd1e15104faa18e0a53287a53dd02e4f8315e780998caef136f68e87f9fb790c6bd6ed5f4a0fde7e95431503cb406b6fb0cc667692da21ae6b7da01fff9d404b1afebef3e970c146129c7d6583a8cb22551d37b59fee6e3a171270b55ac3e2f4c24e438e529a92898504c0a73664016f41f681701fed3282f1761c20c69867def08f0753cc8e917c900cafce61a059239f03676faeceeef72454f4d445c1a514d30fae3f5564107f3254a63813bc0b33e35978ce1b0b41ad18e1e94c204c4befa6706bd13d3b6a0fe83f75f3273fd459b970179a08f12fe2cf362a8c3bf7f9c86cd08cb22b28e636e66c4768943b4c965c6e712e243e8da9605154a5f5b8b7fc07780c57140b3ee36b7086aa461cd151f0e4ed31eee04361806e7651fe046f3d3044a7136237581f86e687e27de3dc1a739cd6f54367d24ff7ed27049cbcb96760d39483ff22cccfbb226410b9ad20df976ffb50e316214bad793c6c98ce2b9e1b9561443c25702c310b140a21d95f38553f14bbbc334dbdd251d4067ed6b49913b5cf56dea6f3ee76a6678d41df546190adaa2a305c187c000fc7f7bcd1a457a3598c806a671e946067fa054039ed9d5d49bdd3269b3de2b0cd4342e9de76fc3bd83f0f3a62e08e461f8402026abd51dc465bdfc23d00eaf09305474d1ac78a5cd71c5fe4286f2ce77139786ce7565a95c1cfcdce8052e711a1af2146597be61b837378a01fe9f12a2ddfb86d316f27862fa6adf01e8d0896ca95e74c412db8e81a9cf6cc1d08322c05007cdc3ae1fcf062dc630f4ebaa89183708e2d1ee7a0f265d0731a64c14b8676e40a4249ed1e7b14e8d6294b3b4793884f3c9273c1b5e98d5eaf424ceeb04234f33fb8cfcae2e57ff44d4eafe45fab3b06f1eca95a161722e1a7134c3f870fbf732303e9cc37e768fa1ab7f13699c72f0d43732e7f4ed2b8f20ad75ec0c631a3eb0e0bdd5ebc1856e75ae1deadfb2f676501d917bc9b73a70b7a2f2fc12f3e77c6cfea2b7935832488acbd13c4c86c930537f26585442235b9a6764f646e6b94dadfeb037c99e7079183a5193a734ffec4e260a26a6966087f559efab6c33605c2f00c9a4f23c2980c603b6888a22464011ceb1165630ab0151ae193ee2ef822659559a75ae7c3a499867724a5e807494d9f0e8e311451ee871c552c05fe4f850b3cdc7cba90bb7bda49d63e153a6704c617818c0595873c133076a006f04f7c98524bfd35c7d6b0f0362179de8bda0e33c76c5ae4d1beb88284aa4c557f80693e5e49f339a6790e08bd858a5c20b1ed47dd5a9ab97b111a331dd6101c65f32e814a0747dc2c6d113fb12a5ce50c5276592a7710061053920173505bdca9eff9813acf8b6af7300dcf9ed5f579f2d772c271ffd27b843e83bb6d53a5c6bb9c228a1e587c57c5d00b2a8d8a0e143ca58a300a1034df39c800b1bf92a1974d2dd0eef791a4b37ca207a3cf1cae2c038b20149256224156cc71a5d862ad3e97cc1fe12989c0d16dc63858b0a0d5515bc4443ea20873c136ecac208f71415dfb8a36e72ff97fcd99f7ecc116ac34cecfea1eb0fba99724069b9f66ec06291fd5f9140959820765529e4f4ec4d37b17b02fee162f785fc939dc711e9c3defed6a27a97dd6349fb8f1d09a5d82238ab0d80e12c5f7833d0e3987e5f2c373cd5f104e64aa6fa2305088eb4f37c4271d58b97b58fe69d9b1ac3724176a56ca061257c47d7a23ce591e950c1657e1b717430dd3a8e236840b9a78618b61718e1aab56a23b95fad28c5a05ae7ce7aa575ea1d881d280f0d93cef1ca91c239d64a6da1d616481f7a8618afd6faee802ed75af1d38db72ac5949ceb7269a389db1dff0ca953be01bcd32b73b16ec1ef36071a30299780ad408b8e0982ac0e8bde65f48e6b1588707a33fa074c26fc26e8bb4ee0ae76a879003986fc19bd19956fc500a5973f143e8772390d48ed45d07d2150ea7b1dc3990226847c5a382fd57c884b3a599903add8bac01dd754d2b6f1462b367eab772a852a1030bf8eaa49933fe163265985321468e196385c12d010e41f55589c71bf972ab2749618d5ce4c5dd3c2652c28d7d9992d92290b18314632826cc4008c38227f3eb36a59c2cf9519266565dc7820f4fe0caa2d02f8431420952b4137be9139c3e0e1ba81771c64e81160f3e1e087b3d6772796d69e9481c246477cf6cbab17ba48f97a5b30b4d9dd6c4dd8aca2a3904111999bb008d9df48ce14b0d7bd00d1f294390490ff1bd46fa94bbf1ea2655cb7baa84e02a418672719a824b477abdce2274ff8e30ff316cb8258addeb577e4f351cc209013e4eda08be39330b4588ffcf852e5858f6b3cf131ec56156c49682ee02351fb419b61ad197330755d193ff0f731d9886ea2a7bd0dd79b48feee19312b46cd8bc63a9b2cfd4934172712b297ee160d79fa4a472e88bcd6365e50659e6360fe22d4e0c35daf141cc789af792328b27caf9bbcc1135c7aea94824d2811cdcb8d6b36ae5088c44907ff7cc8364105139fe3950de49811613026a31c580f262e4e46a9f5cce1da2afe61dcb8f8479561cc9c5cbdb33e98a0d5928d98f36537d85a400af9557c531e038d66f435b5f2ad1535c6b37e4f18016caddf74d649087de94863f020ea10c948acc79e3fbf89560065a6a665ed2812be89ece3f22bac3770fcae20a20f7c9db53594bba62897306588d08f8059796ff7b7ccde080ac9b98a8c32dfb6418dcc911e674ce038bf2be7dfa361e34c018cfc99fa3250a6d423e62e97e904afe5855c9b61a89b754ab697763907fbd89faa7716970ca4a0dbd1cad1656f4f31e1608c3224247a6faa3f15d11e74c2fc665ded0921d6cf1b7c3bf162e0b24c559fdaf9669a3b311499809b5221a6b8649571fd4e47d5779a65e5eec49e269e226c04f1deaa6f25617d0888b746afae718151c767ccacbe688c22ce9850c516696d712bbbc6087566d70abec8076aed3a419ff7694f1a1655897bf6dd1c9a1853b8d72fcbe5a69699c69dc3b624d357dce2cce4213a16006405bff28f451403c2874318452276d11a4e834b64082fa1618a6c38525712d637d79d191d212974c9624f4a263693ff30f0250044b0eb1608758b13a9282aa277c7b563ce60dc43b3c3baed62bcd3fd1d219928022bd4528c8aba51baf83d2c573519d3ab9c4c3b39904dd5ba3e20b0bf2f9a2a428f5f26048ece24863dac2f583f9929b3798490045bb412764cd59b684c5bd51afbaaa53291e98900e7be43f1f553cd47a1a9be8b51956e6afa11e28a515b9dfebd20cd18ea3a91ffd1ee2a85e21f65846a37ee5da1d1f4c255a6e000979630a3cb1c7f3e7edf9bf1e42c86bd4eae0e1524807aea69a7dfd2fee575f72a477fa9f60bd861ea7c9a729081b315cf86b1f9cb3dda55221a41ec3d083ec264f2ccee5e528f4ba641d087499e349c6ae72e5f2c589a500accc767dff13b061596160769dc8de5872714fc522fd8d0dc92a384802a77a27246f6fe0d49b494135e34d67b757d42ec27daf187aae0b8f260caf823323592c7f2267e26c8fd19a63606de1cbd433bf5ea9823b5ef9df760e271556e8e063202797c6fb44774132c843c82ead81ce6ae46cf5f9e19d5cbefe16b1d533c07d9dbe13a67d4ee34abb9eb51c1ae1fb6d566abe8db0439fcc4e09982be4ddfdd13ebb979635c7b0b6e2d214ed8996da318b3bb2e6a2629ca66b797c8c850696ee35ef1d0f31aa7103eb966da73d1cfaeeb630a07d6f93af2db046478d9cc32d6c3954606dcb9ffb4a6935c109dfd6984eb1a7b1473a5b17165c0b087577d3f2acdaade2d5115d0b4688478d80799d7289ef4253949fdc732ca17dd44a89f41710713d7e131347dee86e75097c62949cb840d17440c244544e143b621f10667592128df52f55e939e5a0bc20b8592927adad7d3da0af5d2b640e71ab86f55688ef86f70f297f4393b1c151bbb4e1d2b3de0865f3ad2aa993bef758ae5c8505ce9d33c90b15a3d4c3815e4098440b3b03055cc561d2fe6141d104abb069f11c660de0987988c6e6ffd50230e932c534e318914b6397666928d0fbd50cbf4cdff359bde87bd80193903d86ec3fe46ee9780065f2ea846a04c4a6b85c9c664e2a0c57bcac8bdaed34c4d75304c98975b30213d9985e3d40d188011375567939f6942b9dd57f7e7a26b1643dc513bc484b698897bbd1a6ee816ba6b5ead181770611baa42b2292706f163bf93985c485ba4e37f285208c737dd4ad7b9d752ed44df256a931921bb06ab44a23769df5d92c08dbadbe51d7ed18ec01593daf952f5484b8e2fa64269f0acd8a645cc75a0e8b6a7d295318c2cd85833cb3303f35c901b9de6a5265650ba4006c1a26344f79aa310fecf7ccc7fad7b2cb4a10ec501420565ff5a66166241a57cae573c0e92c849d016fba70d809683a01a547f9cfd06432654ae1b11135ecfc6524f219118106e406c7435c0d5eda3e357e74b6b72c33ebf478489a76bdb4fce2e9c9392acdbe67ccc1724f4bd5f13ff179edb2f9c70ca54e1560c128a9641f2ad1e2cbbe2079459d1400d0f0f48ee6fb35d4c944769774dea19ec547b2fd748f0a313addba7148b5541e9fbcdb547f14f318bf4071eaf8fdca15420de8521cf47a44d22f286f01e19360700c0b01bab3c7ee5e0e8ff89e262b003b108fecbe323180aa6b6e7687013dfbf6f23f845853cc0282ec4e019eb3d5770aee1700e7ded479727d1005c0cea059ce3e41134f0f3db7454362580a5734969ca397f00f340ef7909a5c6a1e7b42f5349fc730fdb5a2e132d1c6d129a250598fa85679b752ec944177358f7181dda832b07cbd77ca7688639611740340448bebbc8fed67ba519759001c36152102e241f79da5d2ae94a71fb6031e5f9d94eee60b41c7c29186cf63a36fb23ae10f596bd5368c33f433423c18c126a0575c4e2199db42f244d4cad209f2e285c643bd9ee29630a69326dbb12e1ff1a00dfbee25bd6c64491a707afec3153d26d7e2efe2f0b4c81cae5fb7a4f26e8b81597686e2a1543f9f5ab51244b9b62677a560479cbf93b7328084980fd6ad55371bdc4d062dca1554e853c9b8fa837388e064566000bf6762ac542144bfb6a50a03a2383112bede52c308c7fa78bfee8ee422f15d72513bced38ea780a14f6f8c9852df53c1522d9217fd3b0b946d874d7c087b3082e32a2d75bcaed8b19efd6215571a2863cec55f3e38608855362f924cb2614bf4c86d67055bcc7d6e129b439a6e1c8623c8b558433bd2b60136c8f921b32b332ec6b0072bc14f02e9766611f715a907820a318b3850ab1a398b05fd311810e41317ee7aea595b74aed9934657e36540352e9c502d658d27291ea3c5223efe24cce4bd75ce628c4f64a8cc40bca58765a129df563b5c49cb11e28172a8bde23f36367c300bab6711a148894d9c740d764c8c53f62e3f8d7aac6c86378ea3537cc8d681f1052f6a20a768439058eda6c2bcad79f2f4abcea15f7c7048013a1aeadff195264c96b7f610a07ac69a64a5fef0d70ee26b85d1c495f0f8d863f08b1aeeadb8e2666a6ae6fb734255e788792c697faca96b7ecffa9875cf54c308fa61b05efff6c4d154f34d537fef54a8855ed4549a814a0321a21853f91d9f33060ddccbb5d2a9f8e757f292264c87ecb8704268da68cf2e416490697b6cde57e6b00c1abd175f5f6064667c0424e63ddf96b5f5cff9c16746dfa811b8182da2043527dfba4ca2ba9626a4edb62d64f902dcdbecbfeb44091a72aac51f95ad318af4cd91cb2298d2a5bcdb31a5c7caf5c3b68115673033ad6a5d5badeb27b36d25024e03b32c8874dba4e0038167e38ef8ffe0a6e2b16a1fb463527782f5d8e15518b3c3b1e1507ab5a215e5aa65c83593ab294515ea5f4cefc08c763fa52d94386627c533f9b06a477306b6884f889d66671595b08b7209f236c44eac5ece5aa22aca7a4cea4673fbf8fc670442a667e59d78be8498e20a3f46fc28ab732ad3adc8e28727ce634d783bd8ede19578dd9609d8c924bf3385f3c58928c8b2b4ed5218660058ee5e8329a101a64f79debf70e0853857670508d6d815d3d17bcd766a59c917a5a052b128b117efb7e941f664ee5a2625b9228d8f9b334b5c8910d613ef1a6afc689a31b2e8d98d1ad505d2e9b55ec134ee722e9c6ddd5b639bc7ec21b433e113382eb2dd1421b628c8cc4dd5562dcf8b9a38a8177b6f2701ccb795325269f41cb1c6e08b94134cd29966633ea0daf6de278c9352f77004e325b016a309a75c9bee45daa44498f1d8a49ece0ed02daf5f190e233eaf2aa209b196525768b993c20b3670e04581c8324bad9542d4d3c815bf5cca7de4f299033b5d9539b4d95d54076b3627a318ad952512227a23ff2dc0c329767172a29aa234278d2aa422af002c7d12f5e97429081dd0122058db0edba3f61c37d5382480f4c6cc59721aefca1fe4a83ae4834488e428d8480535f1cc71f0842e4aa52829a3ca32247f8503bef10edc0aff1f2574fab0b2d7c1b0342a49ba8823169e960e296fe42ff6c64e2c0f374940841eb3114b307f6461c45ec6fdf386f1977c5fd76ec7fe0f011c775fa965c3266c17721c3d3b9214cb0aadb40c9464c843361ce33abf13a9f1eeaa286f8d3a5d2cb8789d413be40c2bc418fd9b3dfeacd4fbea1b8ec19fb03ec5e7c86fba781c33871325161f3a5e3e91d0b73e37a19ef993d33981a8db139fc1d78e0535e40b158293d1f9b15d31716af60f4fc644c208731c48191f8a7d29722977ce432a146b84f6fd75a4b90b08c53b1aaf8c5a8f793adf3d076a4ea6a5e8cc54e682811afdfcde9c3462e88d3417851f152facf4666589470f6cc4eefa52a9743ac31faf4f4180e2759ee0908082ed7376455367880e37556e3c058df4edb67af8291e099c5b13a20e78e411282706dfff0457e6b30391aaad21755206b29374881c6b130484e6ed319552b87465636d4dbf0a156ae698501ef1c2dcc949f635aeeb55305216dffb02bc56344c5246291757dfb452a778627627a611aa1ed59f60bd46289763b5ee37266745d1789e02477c052f03623fe30788b996b8cfdc12e58c98d94844fcd3c6e4db837708bc387eab734fc845ab311437e7828cb4ff4666c8eebca36931b9b1f36bc56b888e741535366cf01acd310e36bf6b0942979067969bc70c3137d3c8012063edb523b56c8626aad09e3f90f7a495035b2d5423a1120d8ec067ca3321b4f6a5787d528e3fe32142203878247c61892d4a4d3cb6a985830f206eb6d9aa4207a1d1dbc0de4412f5e5aa8cb3d8c482ab76a71ce1ebe29a9cdc9cc62f02b99856f0cc040bc0a983c2ec2723cc924680410264cae3c00464f1872daf7a99f9501b8aebed15f93f9847ac925428e870de15e6396699f4d23d19565f13e290753f55a30d67dfd6af4e1b76d22a59418be46e6342d4d25714f4712d44c521c835208948977ea28f4a6641b6ecf9fa7502ceaa9bab3458dccb1d898aa8912688dc6de1ad272153a4e69ba89bdfa8519cfba74194ad6ac5aeec4cbb0c3a7613d1742069fdda51c6827d3e52a0ab584bfeeeba94e0cb18263007f52e376924afa019465f4c240adea9119107943cce06a859f7e12e8c7b52b9d38530d54bce123ada4ceeddb2b8e9c881c73d5776b18a2e52dcffe22f888390e75fa312da6ec50a0753ccfd8ca7bc73bd4b7cf56f019d7e2bc62e44347177276e03caa53295b4034b41f60e3693ffb8a8d92ba53b34d8c7d5eaa534d245a6f0d2612f36ce6cda22a6a1b3985342fb432e998751df229c8851fb8d0ed0e9dd27a8a902a4905888b610bc79973765c807568ea1a0402ecc749c8dd4794485343172bb0ac5ef8e7f4a0c6def49e6b7eac87d2dde479e37885d4fa4813a023619e9e4a24aa2070b1cb5eb58b5bb9ec98ad2dc17672ae09d878df05418ce9b86310d1b71d6d99fac1da090984a0edab7c97feb2c441c9b23a710f8800136416a04d8d15157b8e0dde54ce22981d59c966cb6c9a11f7cdbf8316cef623b14f6d5089e1b739a07110ebd17aacf2718433491ceaa16ce68b5cab45f714b8c36805c3582295f0f0e8e73a8ef53407ba2589397bae3f76f2b2c5800f1a81d68286258126afa0a03a830ea2f4d6369979162a281bbc5dfaafc260bc705c728dd44e3d7b5fed5e3442ea9c8d130f867c34c952e0d0bd3721fdd5feb0b83c8eb1cdc0328cc00940f7b8a44d154559433b3df1449330b353907d3d62ebc43d63ef16db698a91be59ada75d9cd235191270435562c121bc9b34f7cbba259326f12059b8225a37f583bac4d83f34e44e3a9de648f0ca05f5f2a19ef748b7d84c123bd79b69c6fbb1dda6be476a4ef81ccb84a5b16f05b99ead05cdf57e44e26aae3fd785cf9d63802b0bc4e560d48f220454ee6d16e0ce9c7d1badebdf00aa827c6efdad4b0aacb8122f0d35f01bc3e6cba41b8f8fa26db7616914340b19de23861f6ebc9ba805bb7cb0456586b41922d09b59b216d970ea44737f69aef465553560e786161cc752f805cde125589cec710224881f614018ccab9485ccfdc14c20a3bbf66b3af5d49f6f2782f16bf6048950d8368c83300b0fe462aaa2d10f4e3fffea691b91b0dc76569206d79d30ef70b11876d1900bb7f3cf058b3c72273a54861ab699e289ee44ca956168c4aa36b129b2687034dddf1181620a9a8be6944c8d57105ea2017e5914988907f2b29efa763b5c7ec0882fd31f978a96cd63854a9627e43426f05c24c7f86babe24f112b16704f5c093ec742a5334a5b1af08e1a1f6e1a408aa045f8f4807f28b6866a887c1d6db041c0f0b92028789412cfd34a5845e5fc082101dd6b8a2fbefc7a28271ade7f70f7fd944bc2495d7e60a41af11320a9db7bcbe90769ae228708d95fc1806c789dc728a1d6bd0d48c31db21367a6f8d8652504a460987223727435850957b24fe98cc90988b7305aca5b56f86843e7177ff2dbcde44c170b9d82b4a0faad7d75c837e389437c42af47bf2a732f6de63f13f3cec90963df33226db2f7a6e97c9737a2d5980d2e5c26e437a00963f128550132c3f762da58d1f8a9c36ba1330a36a8438154efdb9c90efb11ec271aab065d87b611fd8cc49112eb7f68b2c2c2b66d993e2a2d6c69e0d2dfc0eb653349bfeba40b966f127347079651fbba0ba7a5f3a84ebd856840a72a8c844ade1e6b4a837b2a5573ca7be5fd28302cfb9dc31630365adeb869ded4bc9c1971ff223405bb93f0b74ce5f582065d4acaa07ff0d9465e3a61f89cd2639bbf6a0783972e7a23438e34fca2df0abe7bdccb72c4435b8d0b5a2fb4e682a6fbd25916f1116dce1ece5fc55c6604cb84acbcb7d8630ac32191971cf20da1b7d10aa163ec872add82f870b7c7d873139cba3fc364560b8113e103b8adc575a252466ab6ce23cf38a5fe98309c3a8d96d1410bd97398b1a4f957b920d38f11851a5386a2354e3595a36b52a3586d1a4d580825aaabc6a5a4cdc3d8a9e17857605a065e87004671bc3c48feb0545ced1782a8466826002762d33c47988ed9e0eaebe6cf56d88f908c0d4c2cc76c9fdfdc733a6b0debf6d36d55ca45b231fee6b12e2fa2274b063d2581efc325f1d72c72950f4aa2c057d6305ccdaa70272ee12a91f04476fc6010f390af13f1766d43850755ff11dfe4babf867062f18691c8f7e1d78095cdc8e19b5380209e04628015c525d5a34b033312aeeb073293c904c896248a6e13d6ab6f671b1c0d09879dc1a7d54ded0256d19132755138f71ef86d0428a966f3978999e6a95f19b5edea79825641a8c40553430fa61611da6e67c4b16c41216e4ea2e7e48f737b9cc53ea723e0f66534ecfbb529c2cc0d6a47668e4fab5281d1c44b88e940b97df2137e62d2c7051cac96eda3a0c9800708cc6d24947e030234b6d5ed9d0bf2f285e9cb5d64a43e2f2030cf52d21a5ae978aad19667ea282bd90074c9bf539adb17defddc1e77dfea9e7fbb3040b7e523bc0e988513031ad448bcc70dd5ffa47f524ee81f5ebbb5e12bd35198e0437da1b05c19eb06cb101e4eec1e849ac4ac0defc7477e354a04a2748dc196c87142eed88cc65479b06a8c5e5641f99cdb9</script>
  <div class="hbe hbe-content">
    <div class="hbe hbe-input hbe-input-default">
      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">
      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">
        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>
      </label>
    </div>
  </div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">
    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag"># 设计模式</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/13.%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F/" rel="prev" title="13.桥接模式">
      <i class="fa fa-chevron-left"></i> 13.桥接模式
    </a></div>
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/11.%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/" rel="next" title="11.原型模式">
      11.原型模式 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">zhengyidi</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">39</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">5</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">7</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/zhengyidi" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;zhengyidi" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:zhengyidi1357@gmail.com" title="Contact Me → mailto:zhengyidi1357@gmail.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>Contact Me</a>
      </span>
  </div>



      </div>
        <div class="back-to-top motion-element">
          <i class="fa fa-arrow-up"></i>
          <span>0%</span>
        </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">zhengyidi</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
  <script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

</body>
</html>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/love.js"></script> -->
<!-- 鼠标悬浮 -->
<script type="text/javascript" src="/js/mouse-float.js"></script>

<!-- 鼠标点击爆炸效果 -->
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
<script type="text/javascript" src="/js/fireworks/anime.min.js"></script> 
<script type="text/javascript" src="/js/fireworks/fireworks.js"></script>
